From: Jan Beulich Date: Wed, 7 Dec 2016 12:50:22 +0000 (+0100) Subject: x86: make more use of wr{f,g}sbase() X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~3260 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22man:///%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22man:/?a=commitdiff_plain;h=b053c185e3ff58628233bf90742c1ffd9a3189ed;p=xen.git x86: make more use of wr{f,g}sbase() With suitable canonical address checks added these can also be used in do_set_segment_base(). Also with a canonical address check now in place, there's no need for priv_op_write_msr() to use wrmsr_safe() anymore. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index d8b68e1113..e03753bff1 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -2613,9 +2613,9 @@ static int priv_op_write_msr(unsigned int reg, uint64_t val, return X86EMUL_OKAY; case MSR_SHADOW_GS_BASE: - if ( is_pv_32bit_domain(currd) || !is_canonical_address(val) || - wrmsr_safe(MSR_SHADOW_GS_BASE, val) ) + if ( is_pv_32bit_domain(currd) || !is_canonical_address(val) ) break; + wrmsrl(MSR_SHADOW_GS_BASE, val); curr->arch.pv_vcpu.gs_base_user = val; return X86EMUL_OKAY; diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index b8b6b70a06..9ead02e181 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -1037,24 +1037,33 @@ long do_set_segment_base(unsigned int which, unsigned long base) switch ( which ) { case SEGBASE_FS: - if ( wrmsr_safe(MSR_FS_BASE, base) ) - ret = -EFAULT; - else + if ( is_canonical_address(base) ) + { + wrfsbase(base); v->arch.pv_vcpu.fs_base = base; + } + else + ret = -EINVAL; break; case SEGBASE_GS_USER: - if ( wrmsr_safe(MSR_SHADOW_GS_BASE, base) ) - ret = -EFAULT; - else + if ( is_canonical_address(base) ) + { + wrmsrl(MSR_SHADOW_GS_BASE, base); v->arch.pv_vcpu.gs_base_user = base; + } + else + ret = -EINVAL; break; case SEGBASE_GS_KERNEL: - if ( wrmsr_safe(MSR_GS_BASE, base) ) - ret = -EFAULT; - else + if ( is_canonical_address(base) ) + { + wrgsbase(base); v->arch.pv_vcpu.gs_base_kernel = base; + } + else + ret = -EINVAL; break; case SEGBASE_GS_USER_SEL: